package com.douyin.service.impl;

import com.douyin.dto.Result;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.douyin.entity.Videos;
import com.douyin.mapper.VideosMapper;
import com.douyin.service.VideosService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.douyin.utils.BaseContext;
import org.springframework.beans.factory.annotation.Autowired;
import com.douyin.vo.VideoVO;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * <p>
 * 视频信息表 服务实现类
 * </p>
 *
 * @author k
 * @since 2025-07-27
 */
@Service
public class VideosServiceImpl extends ServiceImpl<VideosMapper, Videos> implements VideosService {

    @Resource
    private VideosMapper videosMapper;
    /**
     * 查询推荐视频列表（分页）
     * 按照创建时间倒序排列，只查询状态为1（已发布）的视频
     *
     * @param page 分页参数，包含当前页码和每页数量
     * @return 分页结果，包含视频VO对象列表
     */
    @Override
    public IPage<VideoVO> queryRecommendVideos(Page<Videos> page) {
        // 构造查询条件：状态为1且按创建时间倒序排列
        LambdaQueryWrapper<Videos> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Videos::getStatus, 1)
                .orderByDesc(Videos::getCreatedAt);

        IPage<Videos> videoPage = baseMapper.selectPage(page, queryWrapper);
        return videoPage.convert(this::convertToVO);
    }

    /**
     * 根据ID获取视频详情
     * 只返回状态为1（已发布）的视频
     *
     * @param id 视频ID
     * @return 视频VO对象，如果视频不存在或状态不正确则返回null
     */
    @Override
    public VideoVO getVideoDetail(Long id) {
        Videos video = baseMapper.selectById(id);
        if (video == null || video.getStatus() != 1) {
            return null;
        }
        return convertToVO(video);
    }

    /**
     * 查询指定用户的视频列表（分页）
     * 按照创建时间倒序排列，只查询状态为1（已发布）的视频
     *
     * @param page   分页参数，包含当前页码和每页数量
     * @param userId 用户ID
     * @return 分页结果，包含该用户发布的视频VO对象列表
     */
    @Override
    public IPage<VideoVO> queryUserVideos(Page<Videos> page, Long userId) {
        // 构造查询条件：指定用户且状态为1，按创建时间倒序排列
        LambdaQueryWrapper<Videos> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Videos::getUserId, userId)
                .eq(Videos::getStatus, 1)
                .orderByDesc(Videos::getCreatedAt);

        IPage<Videos> videoPage = baseMapper.selectPage(page, queryWrapper);
        return videoPage.convert(this::convertToVO);
    }

    /**
     * 增加视频播放次数
     * 使用事务确保操作的原子性
     *
     * @param videoId 视频ID
     */
    @Transactional
    @Override
    public void incrementPlayCount(Long videoId) {
        baseMapper.incrementPlayCount(videoId);
    }

    /**
     * 将Videos实体对象转换为VideoVO对象
     *
     * @param video 视频实体对象
     * @return 视频VO对象
     */
    public VideoVO convertToVO(Videos video) {
        VideoVO vo = new VideoVO();
        BeanUtils.copyProperties(video, vo);
        return vo;
    }

    @Override
    public Result shareVideos(Long videoId) {
        if (videoId == null) {
            return Result.fail("视频id不能为空");
        }
        if (BaseContext.getCurrentId() == null) {
            return Result.fail("用户未登录");
        }
        Videos videos = videosMapper.selectById(videoId);
        if (videos == null) {
            return Result.fail("视频不存在");
        }
        return Result.ok(videos.getVideoUrl());
    }

    @Override
    public Map<Long, VideoVO> queryVideoMapByIds(Collection<Long> videoIds) {
        if (videoIds == null || videoIds.isEmpty()) {
            return Collections.emptyMap();
        }
        // 1. 查询实体列表
        List<Videos> videos = baseMapper.selectBatchIds(videoIds);
        // 2. 转换为 VideoVO 并映射为 Map
        return videos.stream()
                .collect(Collectors.toMap(
                        Videos::getId,  // 键：视频ID
                        this::convertToVO  // 值：转换后的VideoVO
                ));
    }
    /**
     * 搜索视频实现：匹配标题、描述、标签，支持排序
     */
    @Override
    public IPage<VideoVO> searchVideos(String keyword, Integer pageNum, Integer pageSize, String sortBy) {
        // 校验关键词
        if (keyword == null || keyword.trim().isEmpty()) {
            return new Page<>(); // 关键词为空返回空结果
        }

        // 构建分页对象
        Page<Videos> page = new Page<>(pageNum, pageSize);

        // 调用mapper执行联合查询（标题、描述、标签）
        IPage<Videos> videoPage = videosMapper.searchVideos(page, keyword, sortBy);

        // 转换为VO返回
        return videoPage.convert(this::convertToVO);
    }
}
